#include "Config.h"
#include "Exception.h"
#include "WebService.h"

/**
Constructeur
*/
Config::Config(void)
{
	::CoInitialize(NULL);
	_filename = L"visualmp3.cfg";
	_pXMLDoc = NULL;
	HRESULT hr = _pXMLDoc.CreateInstance("Msxml2.DOMDocument.4.0");
	_pXMLDoc->async = false;
	VARIANT filename;
	filename.vt = VT_BSTR;
	filename.bstrVal = ::SysAllocString( _filename.c_str() );
	VARIANT_BOOL vb = _pXMLDoc->load( filename );
	::SysFreeString(filename.bstrVal);
	_pXMLDoc->get_documentElement( &_pXMLRoot );
	_pXMLRootNode = (MSXML2::IXMLDOMNodePtr)_pXMLRoot;
}

/**
Destructeur
*/
Config::~Config(void)
{
	VARIANT filename;
	filename.vt = VT_BSTR;
	filename.bstrVal = ::SysAllocString( _filename.c_str() );
	_pXMLDoc->save( filename );
	::SysFreeString(filename.bstrVal);
}

/**
Met a jour une valeur dans le fichier de configuration
@param[in]	name	identifiant de la valeur
@param[in]	value	valeur chaine a ecrire
*/
void Config::set(const std::wstring& name, const std::wstring& value)
{
	BSTR bstrName = ::SysAllocString( name.c_str() );
	BSTR bstrValue = ::SysAllocString( value.c_str() );
	MSXML2::IXMLDOMNodePtr pXMLElem = _pXMLDoc->createNode( MSXML2::NODE_ELEMENT, bstrName, L"" );
	
	//MSXML2::IXMLDOMElement *pXMLElem =_pXMLDoc->createElement( bstrName );	
	MSXML2::IXMLDOMNodePtr pNode = _pXMLRoot->appendChild( pXMLElem );
	
	pNode->put_text( bstrValue );
	::SysFreeString( bstrName );
	::SysFreeString( bstrValue );
}

/**
Met a jour une valeur dans le fichier de configuration
@param[in]	name	identifiant de la valeur
@param[in]	value	valeur entiere a ecrire
*/
void Config::set(const std::wstring& name, const int& value)
{
	set( name, toString<int>(value) );
}

/**
Met a jour une valeur dans le fichier de configuration
@param[in]	name	identifiant de la valeur
@param[in]	value	valeur decimal a ecrire
*/
void Config::set(const std::wstring& name, const double& value)
{
	set( name, toString<double>(value) );
}

/**
Lit une valeur dans le fichier de configuration
@param[in]	name	identifiant de la valeur
@return valeur lue
*/
std::wstring Config::get(const std::wstring& name)
{
	MSXML2::IXMLDOMNodePtr pXMLItem = XML::getUniqueChild( _pXMLRootNode, name);
	return (wchar_t*)pXMLItem->text;
}